package demo;

import org.junit.Test;
import org.springframework.expression.spel.ast.Operator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * @Author: WWQ
 * @Date: 2019/4/8 15:04
 * @Version 1.0
 */
public class StreamAPITest6 {

    /**
     * 终止操作：
     * 规约：
     *  可以将流中的元素反复结合起来，得到一个值，返回T
     *  reduce(T identity, BinaryOperator<T> accumulator);
     *  可以将流中的元素反复结合起来，得到一个值Operator<T>
     *  reduce(BinaryOperator<T> accumulator);
     *
     *
     *
     */
    List<Employee> emps = Arrays.asList(
            new Employee("张三", 18, 9999.99, Employee.Status.VOCATION),
            new Employee("李四", 59, 6666.66, Employee.Status.BUS),
            new Employee("王五", 28, 3333.33, Employee.Status.FREE),
            new Employee("赵六", 8, 7777.77, Employee.Status.BUS),
            new Employee("田七", 38, 5555.55, Employee.Status.VOCATION)
    );

    List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2,3,4,5,6,7,8,9));

    /**
     * 流中的元素一一结合
     */
    @Test
    public void test1(){
        Integer sum=list.stream().reduce(0,(x,y)->x+y);
        System.out.println(sum);
    }

    /**
     * Map 和reduce的连接通常称为map-reduce模式，因为谷歌用他来进行网盘搜索出名。
     */
    @Test
    public void test2(){
        /**
         * 只有可能为空的值封装到reduce中避免空指针。
         */
        Optional<Double> optional=emps.stream().map((e)->e.getSalary()).reduce(Double::sum);
        System.out.println(optional);
    }
}
